package pe.com.empresa.web.actions.compras;

import java.io.File;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import pe.com.empresa.datos.dao.ArticuloMapper;
import pe.com.empresa.datos.dao.OrdenCompraDetalleMapper;
import pe.com.empresa.datos.dao.OrdenCompraMapper;
import pe.com.empresa.datos.dominio.Articulo;
import pe.com.empresa.datos.dominio.ArticuloExample;
import pe.com.empresa.datos.dominio.ConsultaFiltrarOrdenesCompra;
import pe.com.empresa.datos.dominio.ConsultaFiltrarOrdenesCompraCriteria;
import pe.com.empresa.datos.dominio.ConsultaListarEstadoOrdenCompra;
import pe.com.empresa.datos.dominio.ConsultaListarEstadoOrdenCompraCriteria;
import pe.com.empresa.datos.dominio.ConsultaObtenerEstadoOrdenCompra;
import pe.com.empresa.datos.dominio.ConsultaObtenerEstadoOrdenCompraCriteria;
import pe.com.empresa.datos.dominio.ConsultaObtenerProveedores;
import pe.com.empresa.datos.dominio.EstadoOrdenCompra;
import pe.com.empresa.datos.dominio.OrdenCompra;
import pe.com.empresa.datos.dominio.OrdenCompraDetalle;
import pe.com.empresa.datos.dominio.OrdenCompraDetalleExample;
import pe.com.empresa.datos.dominio.Usuario;
import pe.com.empresa.servicios.businessdelegate.ComprasBusinessDelegate;
import pe.com.empresa.servicios.businessdelegate.PersonasBusinessDelegate;
import pe.com.empresa.servicios.servicio.BuscarOrdenCompraService;
import pe.com.empresa.servicios.servicio.BuscarPersonaService;
import pe.com.empresa.servicios.servicio.GestionarOrdenCompraService;
import pe.com.empresa.utiles.ActionHelper;
import pe.com.empresa.utiles.ComboUtil;
import pe.com.empresa.utiles.Constantes;
import pe.com.empresa.utiles.EstadoOperacion;
import pe.com.empresa.utiles.GrillaArticulos;

public class AutorizarOrdenCompraAction extends ActionHelper {

	private static final long serialVersionUID = -6680154712549085779L;

	private List<ConsultaObtenerProveedores> listaProveedores;
	private List<ComboUtil> listEstados = new ArrayList<ComboUtil>();
	private List<ComboUtil> listFormaPagos = new ArrayList<ComboUtil>();
	private List<ConsultaListarEstadoOrdenCompra> listaEstadosOrdenCompra;
	private ConsultaFiltrarOrdenesCompraCriteria criteria;
	private String fechaGeneracionDesde;
	private String fechaGeneracionHasta;
	private OrdenCompra orden;
	private String estadoAsignado;
	private String numeroOrden;
	private String stringJson;
	private BuscarPersonaService serviceBuscarPersona = new PersonasBusinessDelegate().getBuscarPersonaService();
	private BuscarOrdenCompraService serviceBuscarOrdenCompra = new ComprasBusinessDelegate().getBuscarOrdenCompraService();
	private GestionarOrdenCompraService service = new ComprasBusinessDelegate().getGestionarOrdenCompraService();
	private EstadoOperacion estadoOperacion = new EstadoOperacion();
	private String observacion;
	private File archivo;
	private String archivoContentType;
	private String archivoFileName;
	
	public AutorizarOrdenCompraAction() {
		serviceBuscarPersona.setSqlSessionFactory(this.getSqlSessionFactory());
		serviceBuscarOrdenCompra.setSqlSessionFactory(this.getSqlSessionFactory());
		service.setSqlSessionFactory(this.getSqlSessionFactory());
	}
	
	@Override
	public String execute() throws Exception {

		if(!this.validarInicioSesion()){
			System.out.println("Inicio de sesion invalido o expirado!!");
			return ERROR;
		}
		
		this.cargarCombos();	
		
		return SUCCESS;
	}



	public String filtrarOrdenesPorDefecto(){
		try {
			
			ConsultaFiltrarOrdenesCompraCriteria criteria = new ConsultaFiltrarOrdenesCompraCriteria();
			criteria.setEstado(Constantes.ESTADO_ORDEN_COMPRA_APROBADO_ANALISTA);
			List<ConsultaFiltrarOrdenesCompra> list = serviceBuscarOrdenCompra.filtrarOrdenesComprarPorEstado(criteria);
			stringJson = this.toListJson(list);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return SUCCESS;
	}
	
	public String filtrarOrdenes(){
		try {
			
			
			criteria.setFechaGeneracionDesde(this.dateFormat(this.fechaGeneracionDesde));
			criteria.setFechaGeneracionHasta(this.dateFormat(this.fechaGeneracionHasta));
			List<ConsultaFiltrarOrdenesCompra> list = serviceBuscarOrdenCompra.filtrarOrdenesComprar(criteria);
			stringJson = this.toListJson(list);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return SUCCESS;
	}
	
	
	@SuppressWarnings("unchecked")
	public String evaluarOrden() throws Exception{
		
		if(!this.validarInicioSesion()){
			System.out.println("Inicio de sesion invalido o expirado!!");
			return ERROR;
		}
		
		this.cargarCombos();
		
		serviceBuscarOrdenCompra.setSqlSessionFactory(this.getSqlSessionFactory());
		
		serviceBuscarOrdenCompra.openSession();
						
		orden = (OrdenCompra) serviceBuscarOrdenCompra.selectByPrimaryKey(OrdenCompraMapper.class, numeroOrden);
		numeroOrden = orden.getNumeroOrdenCompra();
				
		ConsultaListarEstadoOrdenCompraCriteria criteria = new ConsultaListarEstadoOrdenCompraCriteria();
		criteria.setNumeroOrdenCompra(numeroOrden);
		listaEstadosOrdenCompra = serviceBuscarOrdenCompra.selectByCriteria("ConsultaListarEstadoOrdenCompra", criteria);
		
		OrdenCompraDetalleExample exmaple = new OrdenCompraDetalleExample();
		exmaple.createCriteria().andNumeroOrdenCompraEqualTo(numeroOrden);
		
		OrdenCompraDetalleMapper mapper = serviceBuscarOrdenCompra.getSession().getMapper(OrdenCompraDetalleMapper.class);
		List<OrdenCompraDetalle> detalle = mapper.selectByExample(exmaple);
		
		List<GrillaArticulos> grilla = new ArrayList<GrillaArticulos>();
		
		for(OrdenCompraDetalle dt : detalle){
			
			GrillaArticulos articulo = new GrillaArticulos();
			articulo.setCodigoArticulo(dt.getCodigoArticulo());
			
				ArticuloMapper mapperArticulo = serviceBuscarOrdenCompra.getSession().getMapper(ArticuloMapper.class);
				ArticuloExample exampleArticulo = new ArticuloExample();
				exampleArticulo.createCriteria().andCodigoArticuloEqualTo(dt.getCodigoArticulo());
				Articulo dataArticulo = (Articulo) mapperArticulo.selectByExample(exampleArticulo).get(0);
				
			articulo.setDescripArticulo(dataArticulo.getNombreArticulo());
			articulo.setCantidadArticulo(dt.getCantidadArticulo());
			articulo.setPrecio(dt.getPrecioUnitario());
			articulo.setSubTotal(new BigDecimal(dt.getCantidadArticulo().doubleValue() * dt.getPrecioUnitario().doubleValue()));
			grilla.add(articulo);
			
		}
		
		this.getSessionContext().setAttribute(Constantes.SESION_GRILLA_ARTICULOS, grilla);
		
		serviceBuscarOrdenCompra.closeSession();
		
		
		return SUCCESS;
	}
	
	
	public String grabarEvaluacion(){
		
		if(!this.validarInicioSesion()){
			System.out.println("Inicio de sesion invalido o expirado!!");
			return ERROR;
		}
		try {
		//System.out.println(archivo.getPath());
		Usuario usuario = (Usuario) this.getSessionContext().getAttribute(Constantes.SESION_USUARIO);
		service.setSqlSessionFactory(this.getSqlSessionFactory());
		service.openSession();
		
		ConsultaObtenerEstadoOrdenCompraCriteria criteria = new ConsultaObtenerEstadoOrdenCompraCriteria();
		criteria.setNumeroOrdenCompra(orden.getNumeroOrdenCompra());
		ConsultaObtenerEstadoOrdenCompra estado = (ConsultaObtenerEstadoOrdenCompra) service.selectByCriteria("ConsultaObtenerEstadoOrdenCompra", criteria).get(0);
		
		if(!estado.getEstadoOrdenCompra().equals(Constantes.ESTADO_ORDEN_COMPRA_APROBADO_ANALISTA)){
			
			estadoOperacion.setEstadoOperacion(Constantes.OP_EXCEPTION);
			estadoOperacion.setMensajeEstado("[ERROR] Solo se pueden aprobar Ordenes de Compra en estado APROBADO POR ANALISTA.");
			
			stringJson = toJson(estadoOperacion);
			
			return SUCCESS;
		}
		
		EstadoOrdenCompra estadoOrden = new EstadoOrdenCompra();
		estadoOrden.setEstado(Integer.parseInt(estadoAsignado));
		estadoOrden.setFechaRegistro(new Date());
		estadoOrden.setIdResponsable(usuario.getIdPersona());
		estadoOrden.setNumeroOrdenCompra(numeroOrden);
		estadoOrden.setObservacion(observacion);
		service.insertar(estadoOrden);
		service.commit();
		
		service.closeSession();
		
		estadoOperacion.setEstadoOperacion(Constantes.OP_SUCCESS);
		estadoOperacion.setMensajeEstado("Estado de Orden de Compra Actualizado con exito.");
		
		} catch (Exception e) {
			// TODO Auto-generated catch block
			
			estadoOperacion.setEstadoOperacion(Constantes.OP_SUCCESS);
			estadoOperacion.setMensajeEstado("Error actualizando Orden de Compra, Intentelo mas tarde.");
			
			e.printStackTrace();
			
		}
			

		
		return SUCCESS;
	}
	
	public List<ConsultaObtenerProveedores> getListaProveedores() {
		return listaProveedores;
	}

	public void setListaProveedores(
			List<ConsultaObtenerProveedores> listaProveedores) {
		this.listaProveedores = listaProveedores;
	}

	public String getFechaGeneracionDesde() {
		return fechaGeneracionDesde;
	}

	public void setFechaGeneracionDesde(String fechaGeneracionDesde) {
		this.fechaGeneracionDesde = fechaGeneracionDesde;
	}

	public String getFechaGeneracionHasta() {
		return fechaGeneracionHasta;
	}

	public void setFechaGeneracionHasta(String fechaGeneracionHasta) {
		this.fechaGeneracionHasta = fechaGeneracionHasta;
	}

	public ConsultaFiltrarOrdenesCompraCriteria getCriteria() {
		return criteria;
	}

	public void setCriteria(ConsultaFiltrarOrdenesCompraCriteria criteria) {
		this.criteria = criteria;
	}

	public List<ComboUtil> getListEstados() {
		return listEstados;
	}

	public void setListEstados(List<ComboUtil> listEstados) {
		this.listEstados = listEstados;
	}

	public String getStringJson() {
		return stringJson;
	}

	public void setStringJson(String stringJson) {
		this.stringJson = stringJson;
	}
	public List<ComboUtil> getListFormaPagos() {
		return listFormaPagos;
	}

	public void setListFormaPagos(List<ComboUtil> listFormaPagos) {
		this.listFormaPagos = listFormaPagos;
	}

	public OrdenCompra getOrden() {
		return orden;
	}

	public void setOrden(OrdenCompra orden) {
		this.orden = orden;
	}

	public String getEstadoAsignado() {
		return estadoAsignado;
	}

	public void setEstadoAsignado(String estadoAsignado) {
		this.estadoAsignado = estadoAsignado;
	}

	public String getNumeroOrden() {
		return numeroOrden;
	}

	public void setNumeroOrden(String numeroOrden) {
		this.numeroOrden = numeroOrden;
	}

	private void cargarCombos() throws Exception {
		// TODO Auto-generated method stub
		
		listaProveedores = serviceBuscarPersona.obtenerProveedores();
		{
			ComboUtil combo = new ComboUtil();
			combo.setValor("1");
			combo.setDescriptivo("Generado");
			listEstados.add(combo);
		}
		{
			ComboUtil combo = new ComboUtil();
			combo.setValor("2");
			combo.setDescriptivo("Aprobado Analista");
			listEstados.add(combo);
		}
		{
			ComboUtil combo = new ComboUtil();
			combo.setValor("3");
			combo.setDescriptivo("Autorizado Sub Gerente");
			listEstados.add(combo);
		}
		{
			ComboUtil combo = new ComboUtil();
			combo.setValor("4");
			combo.setDescriptivo("Desaprobado por Analista");
			listEstados.add(combo);
		}
		{
			ComboUtil combo = new ComboUtil();
			combo.setValor("5");
			combo.setDescriptivo("Desaprobado por Sub Gerente");
			listEstados.add(combo);
		}
		{
			ComboUtil combo = new ComboUtil();
			combo.setValor("6");
			combo.setDescriptivo("En Evaluacion");
			listEstados.add(combo);
		}
		
		//
		{
			ComboUtil combo = new ComboUtil();
			combo.setValor("1");
			combo.setDescriptivo("Al Contado");
			listFormaPagos.add(combo);
		}
		{
			ComboUtil combo = new ComboUtil();
			combo.setValor("2");
			combo.setDescriptivo("Credito");
			listFormaPagos.add(combo);
		}
	}

	public EstadoOperacion getEstadoOperacion() {
		return estadoOperacion;
	}

	public void setEstadoOperacion(EstadoOperacion estadoOperacion) {
		this.estadoOperacion = estadoOperacion;
	}

	public List<ConsultaListarEstadoOrdenCompra> getListaEstadosOrdenCompra() {
		return listaEstadosOrdenCompra;
	}

	public void setListaEstadosOrdenCompra(
			List<ConsultaListarEstadoOrdenCompra> listaEstadosOrdenCompra) {
		this.listaEstadosOrdenCompra = listaEstadosOrdenCompra;
	}

	public String getObservacion() {
		return observacion;
	}

	public void setObservacion(String observacion) {
		this.observacion = observacion;
	}

	public File getArchivo() {
		return archivo;
	}

	public void setArchivo(File archivo) {
		this.archivo = archivo;
	}

	public String getArchivoContentType() {
		return archivoContentType;
	}

	public void setArchivoContentType(String archivoContentType) {
		this.archivoContentType = archivoContentType;
	}

	public String getArchivoFileName() {
		return archivoFileName;
	}

	public void setArchivoFileName(String archivoFileName) {
		this.archivoFileName = archivoFileName;
	}
}
